package com.qinggeng.project.system.service;

import com.qinggeng.common.enums.CommonEnum;
import com.qinggeng.common.enums.OrdersStatusCodeEnum;
import com.qinggeng.common.enums.PayTypeEnum;
import com.qinggeng.common.utils.DateUtils;
import com.qinggeng.project.api.dto.*;
import com.qinggeng.project.system.domain.OrderStatistics;
import com.qinggeng.project.system.domain.Orders;
import com.qinggeng.project.system.domain.PrintData;
import com.qinggeng.project.system.domain.vo.OrderLineVo;
import com.qinggeng.project.system.domain.vo.OrderStatifyVo;
import com.qinggeng.project.system.domain.vo.OrderStatisticsVO;
import com.qinggeng.project.system.domain.vo.OrdersSingleGoodsReturnVO;
import com.qinggeng.project.system.dto.OrderStatisticsDTO;
import com.qinggeng.project.system.dto.OrdersSingleGoodsReturnDTO;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 订单列Service接口
 *
 * @author qinggeng
 * @date 2020-06-17
 */
public interface IOrdersService {
    /**
     * 查询订单列
     *
     * @param ordersId 订单列ID
     * @return 订单列
     */
    public Orders selectOrdersById(Long ordersId);

    /**
     * 根据订单ID和用户ID查询订单
     *
     * @param ordersId
     * @param userId
     * @return
     */
    Orders selectOrdersByIdAndUserId(Long ordersId, Long userId);

    /**
     * 查询订单列列表
     *
     * @param orders 订单列
     * @return 订单列集合
     */
    public List<Orders> selectOrdersList(Orders orders);

    List<Orders> listOrdersByTime(Orders orders);

    public List<Orders> selectOrdersReturnList(Orders orders);

    /**
     * 新增订单列
     *
     * @param orders 订单列
     * @return 结果
     */
    public int insertOrders(Orders orders);

    /**
     * 修改订单列
     *
     * @param orders 订单列
     * @return 结果
     */
    public int updateOrders(Orders orders);

    /**
     * 批量删除订单列
     *
     * @param ordersIds 需要删除的订单列ID
     * @return 结果
     */
    public int deleteOrdersByIds(Long[] ordersIds);

    /**
     * 删除订单列信息
     *
     * @param ordersId 订单列ID
     * @return 结果
     */
    public int deleteOrdersById(Long ordersId);

    /**
     * 创建单商品订单
     *
     * @param distType      配送方式
     * @param ordersInfoDto
     * @param userId
     * @return
     */
    Orders createOrders(String distType, AddOrdersInfoDto ordersInfoDto, Long userId);

    /**
     * 创建拼团订单
     *
     * @param distType      配送方式
     * @param ordersInfoDto
     * @param userId
     * @return
     */
    Orders createOrders1(String distType, AddOrdersInfoDto ordersInfoDto, Long userId,List<FavorableDTO> favorableDTOS);

    /**
     * 更具订单号查询
     *
     * @param ordersNo
     * @return
     */
    Orders selectOrdersByOrdersNo(String ordersNo);

    /**
     * 查询是否支付成功
     *
     * @param ordersNo
     * @return
     */
    int selectPayStatusSuccess(String ordersNo);

    /**
     * 查询订单数量
     *
     * @param where
     * @return
     */
    int selectOrdersCount(Orders where);

    /**
     * 配送订单列表
     *
     * @param status
     * @param lng
     * @param lat
     */
    List<OrdersDistDto> selectOrdersDiscDtoList(Integer status, Float lng, Float lat, Long pointId);


    /**
     * 支付回调
     *
     * @param outTradeNo
     */
    void notifyCallback(String outTradeNo, String payType);

    int updateOrdersState(Orders orders);

    /**
     * 抢单
     *
     * @param ordersId
     * @param userId
     * @param lng
     * @param lat
     */
    void discOrdersTake(Long ordersId, Long userId, Float lng, Float lat);

    /**
     * 确认取货
     *
     * @param ordersNo
     * @param userId
     */
    void discOrdersAckTake(String ordersNo, Long userId);

    void discOrdersAckTake(String ordersNo, Long userId,Long pointId);


    /**
     * 确认送达
     *
     * @param ordersNo
     * @param userId
     */
    //void discOrdersAckSend(Long ordersId, Long userId,String receiver);
    void discOrdersAckSend(String ordersNo, Long userId, String receiver);

    /**
     * 配送订单列表数量
     */
    int selectOrdersDiscDtoCount(Long pointId, Integer status, Long startTime, Long endTime);

    /**
     * 获取配送员我的订单
     *
     * @param status
     * @return
     */
    List<OrdersDistDto> selectOrdersDiscDtoUserList(Integer status, Long pointId, Long startTime, Long endTime);

    List<OrderStatistics> statisticsOderEveryInCome();

    OrderStatifyVo statifyOrderCountAll();


    OrderStatifyVo orderStatifyToday();

    List<OrderLineVo> statifyOrderLine();

    /**
     * 确认收货
     *
     * @param ordersId
     * @param userId
     */
    boolean affirmTake(Long ordersId, Long userId);


    /**
     * 取消订单
     *
     * @param ordersId
     * @param userId
     * @param cancelRemark
     */
    boolean ordersCancel(Long ordersId, Long userId, String cancelRemark);

    /**
     * 订单抽奖免单中奖退款
     *
     * @param ordersId
     * @param userId
     */
    boolean ordersRefund(Long ordersId, Long userId);

    /**
     * 获取用户一条配送订单
     *
     * @param userId
     * @return
     */
    Orders selectOrdersByDefaultUserId(Long userId);

    void refundDist(Orders orders);

    /**
     * 设置订单详情
     *
     * @param orders
     * @return
     */
    OrdersInfoDto setOrdersInfo(Orders orders);

    /**
     * 获取订单打印数据
     *
     * @return
     */
    List<PrintData> selectPrintDataList(Long shopId);

    /**
     * 修改订单打印状态
     *
     * @param orders
     * @param beforeStatus 修改前状态
     * @param afterStatus  修改后状态
     * @return
     */
    boolean updateOrdersPrintStatus(Orders orders, String beforeStatus, String afterStatus);


    /**
     * 获取订单打印状态
     *
     * @param orders
     * @return
     */
    String getOrdersPrintStatus(Orders orders);



    /**
     * 用户 userId
     * @param
     * @return true 下过单   false 没有下过单
     */
    public Boolean checkPlaceAnOrder(Long userId);

    /**
     * 更新免费订单的支付状态
     * @param ordersId
     * @return
     */
    int updateFreePayOrdersPayStatus(Long ordersId);

    /**
     * 更新免费订单的支付状态，并发送mq消息
     * @param ordersId
     */
    void updateOrdersPayStatusAndSendMessages(Long ordersId);


    //设置订单展示价格
    void setPrice(AddOrdersInfoDto ordersInfoDto,BigDecimal totalPrice,BigDecimal reducePrice,String distType);

    void setPrice(AddOrdersInfoDto ordersInfoDto, BigDecimal totalPrice);

    //单商品退款
     boolean ordersSingleRefund(Long orderId,Long userId);

    //单商品退款列表
    List<OrdersSingleGoodsReturnVO>selectOrdersSingleGoodsReturnList(OrdersSingleGoodsReturnDTO dto);

    //自动接单
    boolean ordersDistAutoTake(String ordersNo);

    //订单完结
    boolean updateOrdersEndStatus(Long ordersId);
    //自动发货
    boolean ordersAutoShip(String ordersNo);
    //订单发货
    boolean ordersShip(String ordersNo);

    List<String> listOrdersNoByTime(String startTime,String endTime);

    /**
     * 更新退款金额
     * @param ordersNo
     * @param money
     * @return
     */
    boolean updateOrdersPayment(String ordersNo,String money);

    /**
     * 根据用户ID获取指定时间段内订单总额
     * @param startTime
     * @param endTime
     * @return
     */
    BigDecimal getOrdersTotalPrice(Date startTime, Date endTime);


    boolean updateOrderspointCommission(Long orderId,String pointPrice, String pointCommission);


    List<OrderStatisticsVO> listOrderStatistics(OrderStatisticsDTO dto);

    boolean updatePaymentOnBehalfOfType(String ordersNo);
}
